package com.gzt.bookcatalog.controller;

import com.gzt.bookcatalog.dto.BookRequestDTO;
import com.gzt.bookcatalog.dto.BookResponseDTO;
import com.gzt.bookcatalog.dto.BookSearchDTO;
import com.gzt.bookcatalog.dto.RestResult;
import com.gzt.bookcatalog.service.BookService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/books")
public class BookController {
    private final BookService bookService;
    private static final Logger logger = LoggerFactory.getLogger(BookController.class);


    public BookController(BookService bookService) {
        this.bookService = bookService;
    }

    /**
     * 获取所有图书信息
     *
     * @return 包含所有图书信息的响应结果
     */
    @Operation(summary = "获取所有图书信息")
    @GetMapping
    public RestResult<List<BookResponseDTO>> getAllBooks() {
        return RestResult.success(bookService.getAllBooks());
    }

    /**
     * 根据 ID 获取图书信息
     *
     * @param id 图书 ID，必须为非空正数
     * @return 包含指定图书信息的响应结果
     */
    @Operation(summary = "根据 ID 获取图书信息")
    @GetMapping("/{id}")
    public RestResult<BookResponseDTO> getBookById(
            @PathVariable @NotNull(message = "图书 ID 不能为空") @Positive(message = "图书 ID 必须为正数") Long id) {
        return RestResult.success(bookService.getBookById(id));
    }


    /**
     * 创建新图书
     *
     * @param bookRequestDTO 图书请求 DTO
     * @return 包含新创建图书信息的响应结果
     */
    @Operation(summary = "创建新图书")
    @PostMapping
    public RestResult<BookResponseDTO> createBook(@Valid @RequestBody BookRequestDTO bookRequestDTO) {
        return RestResult.success(bookService.createBook(bookRequestDTO));
    }

    /**
     * 根据 ID 更新图书信息
     * @param id 图书 ID，必须为非空正数
     * @param bookRequestDTO 图书请求 DTO
     * @return 包含更新后图书信息的响应结果
     */
    @Operation(summary = "根据 ID 更新图书信息")
    @PutMapping("/{id}")
    public RestResult<Boolean> updateBook(@PathVariable @NotNull(message = "图书 ID 不能为空") @Positive(message = "图书 ID 必须为正数") Long id,
                                                  @Valid @RequestBody BookRequestDTO bookRequestDTO) {
        try {
            logger.info("开始更新图书信息，图书 ID: {}", id);
            BookResponseDTO updatedBook = bookService.updateBook(id, bookRequestDTO);
            logger.info("图书信息更新成功，图书 ID: {}", id);
            return RestResult.success(updatedBook != null);
        } catch (Exception e) {
            logger.error("图书信息更新失败，图书 ID: {}", id, e);
            return RestResult.error("图书信息更新失败，请稍后重试");
        }
    }


    /**
     * 根据 ID 删除图书
     * @param id 图书 ID，必须为非空正数
     * @return 包含删除操作结果的响应结果
     */
    @Operation(summary = "根据 ID 删除图书")
    @DeleteMapping("/{id}")
    public RestResult<Boolean> deleteBook(@PathVariable @NotNull(message = "图书 ID 不能为空") @Positive(message = "图书 ID 必须为正数") Long id) {
        try {
            logger.info("开始删除图书，图书 ID: {}", id);
            bookService.deleteBook(id);
            logger.info("图书删除成功，图书 ID: {}", id);
            return RestResult.success(true);
        } catch (Exception e) {
            logger.error("图书删除失败，图书 ID: {}", id, e);
            return RestResult.error("图书删除失败，请稍后重试");
        }
    }


    /**
     * 根据关键词搜索图书，支持分页
     *
     * @param searchDTO 包含搜索关键词和分页参数的 DTO
     * @return 包含搜索结果的分页响应结果
     */
    @Operation(summary = "根据关键词搜索图书，支持分页")
    @GetMapping("/search")
    public RestResult<Page<BookResponseDTO>> searchBooks(
            @Valid @ModelAttribute @Parameter(description = "搜索参数 DTO") BookSearchDTO searchDTO) {
        try {
            logger.info("开始搜索图书，关键词: {}, 页码: {}, 每页数量: {}",
                    searchDTO.getQuery(), searchDTO.getPage(), searchDTO.getSize());
            Page<BookResponseDTO> result = bookService.searchBooks(searchDTO);
            logger.info("图书搜索完成，共找到 {} 条记录", result.getTotalElements());
            return RestResult.success(result);
        } catch (Exception e) {
            logger.error("图书搜索失败，关键词: {}", searchDTO.getQuery(), e);
            return RestResult.error("图书搜索失败，请稍后重试");
        }
    }
}